#include <stdio.h>
#include <malloc.h>
#include <assert.h>

typedef struct {
    int* arr;      // 数据存储指针
    size_t size;    // 当前元素数量
    size_t capacity;// 总容量
}SL;
//初始化
void init(SL *p){
    p->arr=NULL;
    p->size=0;
    p->capacity=0;
}
//销毁
void destory(SL *p){
    free(p->arr);
    p->arr=NULL;
    p->size=0;
    p->capacity=0;
}
//扩容
void checkCapacity(SL *p){
    if(p->size==p->capacity){
        //申请空间
        int newCapacity=p->capacity==0?4:2*p->capacity;
        int *temp= realloc(p->arr,sizeof (int)*newCapacity);
        if(temp==NULL){
            printf("扩容失败");
        }
        p->arr=temp;
        p->capacity=newCapacity;
        printf("%d\n",p->capacity);
    }
}
//尾部插入元素
void pushBack(SL *p,int n){
    checkCapacity(p);
    p->arr[p->size++]=n;
}
//打印数组
void SLprintf(SL *p){
    for (int i = 0; i < p->size; ++i) {
        printf("%d\n",p->arr[i]);
    }
}
//头部插入
void pushFront(SL *p,int n){
    checkCapacity(p);
    for (int i = p->size; i > 0 ; i--) {
        p->arr[i]=p->arr[i-1];
    }
    p->arr[0]=n;
    p->size++;
}
//在任意位置插入
void insert(SL *p,int pos,int n){
    if(pos>=0&&pos<=p->size){
        checkCapacity(p);
        for (int i = p->size; i >pos ; i--) {
            p->arr[i]=p->arr[i-1];
        }
        p->arr[pos]=n;
        p->size++;
    }
    else{
        printf("插入的元素位置错误");
    }
}

//删除表头
void deleteFront(SL *p){
    for (int i = 0; i < p->size-1; ++i) {
        p->arr[i]=p->arr[i+1];
    }
    p->size--;
}
//删除任意位置
void del(SL *p,int pos){
    assert(pos>=0&&pos<=p->size);
    for (int i = pos; i < p->size; ++i) {
        p->arr[i]=p->arr[i+1];
    }
    p->size--;
}
//查找元素
int find(SL *p,int n) {
    for (int i = 0; i < p->size; ++i) {
        if (p->arr[i]==n) {
            return i;
        }
    }
    return -1;
}

int main() {
    SL L;
    init(&L);
    pushBack(&L,15);
    SLprintf(&L);
    printf("\n");
    pushFront(&L,12);
    SLprintf(&L);
    printf("\n");
    insert(&L,1,23);
    SLprintf(&L);

    printf("\n");

    deleteFront(&L);
    SLprintf(&L);
    printf("\n");
    del(&L,0);
    SLprintf(&L);
    return 0;
}
